public class Test {
    public static void main(String[] args) {
        int[][] arr = {{0,0},{1,1},{0,0}};
    }
    //62.不同路径1
    public int uniquePaths(int m, int n) {
        int[][] dp = new int[m][n];
        //1.初始化第一行/第一列
        for(int i=0;i<n;i++) dp[0][i] = 1;
        for(int i=0;i<m;i++) dp[i][0] = 1;
        //2.填表
        for(int i=1;i<m;i++)
            for(int j = 1;j<n;j++)
                dp[i][j] = dp[i-1][j]+dp[i][j-1];
        return dp[m-1][n-1];
    }
    //不同路径2

    public int uniquePathsWithObstacles(int[][] obstacleGrid) {
        int m = obstacleGrid.length;
        int n = obstacleGrid[0].length;
        int[][] dp = new int[m][n];
        if(obstacleGrid[0][0]==1) return 0;
        else dp[0][0] = 1;
        for(int i=1;i<n;i++)  {
            if(obstacleGrid[0][i] == 0 && obstacleGrid[0][i-1]==0 && dp[0][i-1]==1) dp[0][i] = 1;
            else dp[0][i] = 0;
        }
        for(int i=1;i<m;i++)  {
            if(obstacleGrid[i][0] == 0 && obstacleGrid[i-1][0]==0 && dp[i-1][0]==1) dp[i][0] = 1;
            else dp[i][0] = 0;
        }

        for(int i=1;i<m;i++) {
            for(int j=1;j<n;j++) {
                if(obstacleGrid[i][j] == 0) dp[i][j] = dp[i-1][j]+dp[i][j-1];
                else obstacleGrid[i][j] = 0;
            }
        }
        return dp[m-1][n-1];
    }

}
